python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片 您所在的位置:网站首页 python 批量创建文件的几种方法有哪些图片 python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片

python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片

2024-07-16 00:02| 来源: 网络整理| 查看: 265

python多种方法压缩图片,opencv、PIL、tinypng压缩图片文章目录: 1 python+opncv实现图片的压缩2 python+PIL实现图片的压缩3 python+tinypng实现图片的压缩3.1 tinypng介绍3.2 tinypng压缩图片API使用3.2.1 tingypng安装3.2.2 tingypng安装3.2.3 tingypng优缺点: 4 python+pngquant实现图片的压缩

1 python+opncv实现图片的压缩 class Compress_img: def __init__(self, img_path): self.img_path = img_path self.img_name = img_path.split('/')[-1] def compress_img_CV(self, compress_rate=0.5, show=False): img = cv2.imread(self.img_path) heigh, width = img.shape[:2] # 双三次插值 img_resize = cv2.resize(img, (int(heigh*compress_rate), int(width*compress_rate)), interpolation=cv2.INTER_AREA) cv2.imwrite('result_cv_' + self.img_name, img_resize) print("%s 已压缩," % (self.img_name), "压缩率:", compress_rate) if show: cv2.imshow(self.img_name, img_resize) cv2.waitKey(0) if __name__ == '__main__': img_path = './ym.jpg' compress = Compress_img(img_path) # 使用opencv压缩图片 compress.compress_img_CV() 2 python+PIL实现图片的压缩 class Compress_img: def __init__(self, img_path): self.img_path = img_path self.img_name = img_path.split('/')[-1] def compress_img_PIL(self, way=1, compress_rate=0.5, show=False): ''' img.resize() 方法可以缩小可以放大 img.thumbnail() 方法只能缩小 :param way: :param compress_rate: :param show: :return: ''' img = Image.open(self.img_path) w, h = img.size # 方法一:使用resize改变图片分辨率,但是图片内容并不丢失,不是裁剪 if way == 1: img_resize = img.resize((int(w*compress_rate), int(h*compress_rate))) resize_w, resieze_h = img_resize.size img_resize.save('result_' + self.img_name) if show: img_resize.show() # 在照片应用中打开图片 # 或 # plt.imshow(img_resize) # plt.axis('off') # plt.show() # 方法二: 和resize方法类似,不过这里我测试好型这个函数已经不能使用,不知是不是版本问题 # 问题:https://blog.csdn.net/kethur/article/details/79992539 tumbnail没有返回值 if way == 2: # img_resize = img.thumbnail((400, 400)) img.thumbnail((int(w*compress_rate), int(h*compress_rate))) resize_w, resize_h = img.size img.save('result2_' + self.img_name) print("%s 已压缩," % (self.img_name), "压缩率:", compress_rate) if __name__ == '__main__': img_path = './ym.jpg' compress = Compress_img(img_path) # 使用PIL压缩图片 compress.compress_img_PIL(way=1, show=True) 3 python+tinypng实现图片的压缩 3.1 tinypng介绍

打开它的官网https://tinypng.com发现其提供线上上传图片进行压缩,看到例子介绍压缩率还是蛮可观的,而且压缩前后对图片影响不大。我们点进去DEVELOPER API,可以看出tingpng支持很多变成语言API,如下:

HTTPRUBYPHPNODE.JSPYTHONJAVA.NET

tinypng对图片的压缩率可以达到惊人的90%(例如:一张20M的图片可以被压缩到2M),除了对图片压缩,它的 API 还提供图片裁剪、加水印、保存压缩图片至云服务商(亚马逊云、谷歌云)等功能,非常强大

tinypng并不是完全免费的,每个月可以免费调用API使用500次: 在这里插入图片描述

3.2 tinypng压缩图片API使用 3.2.1 tingypng安装

先安装tinypng

pip install --upgrade tinify

3.2.2 tingypng安装

1、申请API使用,生成key

在官网,填写your full name和your email,填写好之后你会收到一封邮件

full name:shliangemail:[email protected] 在这里插入图片描述 2、打开邮件跳转获取Key 在这里插入图片描述

3、python + tinypng实现图片压缩 获取到专属的Key之后,你就可以使用相应的API实现图片的压缩了

import tinify tinify_keys = ""YOUR_API_KEY"" source = tinify.from_file("test.jpg") source.to_file("compress_img.jpg")

实测:

压缩前图片大小:3.53M压缩后图片大小:627kb压缩比率: c o m p r e s s _ r a t e = 3.53 × 1024 k b − 627 k b 3.53 × 1024 k b × 100 % ≈ 82.7 % compress\_rate = \frac{3.53 \times1024kb-627kb}{3.53 \times1024 kb}\times100\% \approx82.7\% compress_rate=3.53×1024kb3.53×1024kb−627kb​×100%≈82.7%压缩3.53M图片用时:29s

图片压缩的时间比较长,但是图片压缩的效果非常好,首先压缩后图片的分辨率保持不变,其次压缩后图片的清晰度和原图几乎一样,真的很牛!(我严重怀疑这是通过一种深度学习方法实现的[捂脸])

3.2.3 tingypng优缺点:

优点:

图片压缩比率高几乎可以实现无损压缩压缩不改变图片分辨率

缺点:

压缩时间比较长收费:显然这对于一个工程应用是不能使用的 4 python+pngquant实现图片的压缩

pngquant是国外一个有损的PNG压缩库,介绍称结合vector quantization算法生成高质量的色彩范围,用脚本同样可以处理批量图片压缩。其支持命令行和源码库形式使用,这里介绍的是使用命令行方式:

pngquant只能对png图片进行压缩官方称:图片的压缩率可以达到70%

官网:https://pngquant.org/

使用:

import subprocess #需修改为你自己本地pnguant.exe路径 PNGQUANT_PATH = r'Your path\pngquant.exe' ... cmd_command = '"{0}" 256 -s1 --force --quality=50-50 "{1}" -o "{2}"'.format(PNGQUANT_PATH, "unoptimized.png", "optimized.png") #执行命令 p = subprocess.Popen(cmd_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) retval = p.wait()

实测:

压缩前图片大小:2.81M压缩后图片大小:733kb压缩比率: c o m p r e s s _ r a t e = 2.81 × 1024 k b − 733 k b 2.81 × 1024 k b × 100 % ≈ 74.5 % compress\_rate = \frac{2.81 \times1024kb-733kb}{2.81 \times1024 kb}\times100\% \approx74.5\% compress_rate=2.81×1024kb2.81×1024kb−733kb​×100%≈74.5%

##4.2 jpg图片转换成png图片

由于jpg图片时没有alpha通道的,而pngquant只能对png图片进行压缩。因此,因此我的想法是这样的:

1、把jpg图片转化成png图片

2、使用pngquant对压缩的图片进行压缩

3、把压缩后的png图片再转换成jpg图片

JPEG - JPEG图像旨在通过删除人眼不会注意到的信息,使详细的摄影图像尽可能小。因此,与PNG相比,图像的尺寸相当小。但是在JPG图像中,您无法存储图像的Alpha透明度信息。因此,如果不需要透明度信息,JPG是最具可扩展性的解决方案。

PNG - PNG是一种很好的格式,它将无损编码与直接颜色(数千种颜色,就像JPEG)相结合。它支持alpha透明度。保存为PNG的照片可能比同等JPEG图像大至少5倍,可见质量几乎没有改善。因此,如果文件大小不是问题,并且您希望获得最佳质量,那么PNG就是好的。

###4.2.1 jpg图片转换成png图片

1

2、方法二:使用`PythonMagick库实现jpg转换png

PythonMagick库无法用pip或者easy_install来安装,因此,需要手动安装,地址如下(非官方的python库包):

https://www.lfd.uci.edu/~gohlke/pythonlibs/#pythonmagick

选择合适版本下载后,进入文件所在位置,直接pip install + 文件名即可完成安装。

import PythonMagick # 1 使用PythonMagick图片格式转换 jpg2png jpg:3.71M-> png:13.74M im = PythonMagick.Image('./test.jpg') # im.sample('128x128') im.write('output.png') # 2 使用pngquant对图片压缩: png:13.74M->png:3.81M # 3 使用PythonMagick图片格式转换 png2jpg png:3.81M->jpg:4.81M (笑cry) im = PythonMagick.Image('./output.png') # im.sample('128x128') im.write('output.jpg')

实测:

一样3.71M的jpg图片转换成png图片大小为:13.74M

然后再使用pngquant压缩,压缩后的图片大小为:3.63M,压缩后的图片有一定的信息损失

###4.2.2 png图片转换成jpg图片

在从PNG转换为JPG时,我们以jpeg格式创建新图像文件,读取png图像,然后将读取的图像粘贴到新创建的空白jpg图像。然后保存jpg图像文件。这是从PNG转换为JPG背后的基本思想。

from PIL import Image # png: 3.81M -> jpg:1.49M im = Image.open("output.png") rgb_im = im.convert('RGB') rgb_im.save('result_PIL_jpg2png.jpg')

from PIL import Image im = Image.open("output.png") bg = Image.new("RGB", im.size, (255,255,255)) bg.paste(im,im) bg.save('result_PIL_jpg2png2.jpg')

参考:https://blog.csdn.net/weixin_39153202/article/details/96566897 # 图片格式转换



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有